#============================================
# #知识点(了解，不需要自己处理)
# 多个进程操作同-份数据的时候，会出现数据错乱的问题
# 针对上述问题，解决方式就是加锁处理:* *将并发变成串行，牺牲效率但是保证了数据的安全
# 先用obj = Lock()生成一个锁对象,在需要保护得地方加上obj.acquire()开启互斥锁,obj.release()释放互斥锁
#============================================
from multiprocessing import Process,Lock
dic = {"piao":1}
#因为这里只能进程调用全局变量，只会改变它产生名称空间里得变量，改不了主程序得全局变量
def serch(i):
    num = dic.get("piao")
    print(f"用户{i}剩余票数为{num}")

def buy(i):
    num = dic.get("piao")
    if num >=1:
        dic["piao"] -= 1
        print(f"用户{i}购买成功!")
    else:
        print(f"用户{i}购买失败!")

def run(i,obj):
    serch(i)
    obj.acquire()
    buy(i)
    obj.release()

if __name__ == "__main__":
    for i in range(1,5):
        obj = Lock()
        x = Process(target=run,args=(i,obj))
        x.start()
# 注意:
# 1.锁不要轻易的使用，容易造成死锁现象(我们写代码一般不会用到，都是内部封装好的)
# 2.锁只在处理数据的部分加来保证数据安全(只在争抢数据的环节加锁处理即可)|
#============================================     
